bitkeeper revision 1.1159.1.14 (4117467elQav6yf21P_6arzR_7_87A)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Mon, 9 Aug 2004 09:40:14 +0000 (09:40 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Mon, 9 Aug 2004 09:40:14 +0000 (09:40 +0000)
Adjust timeofday for tick interrupts that we haven't taken yet.

linux-2.6.7-xen-sparse/arch/xen/i386/kernel/time.c

index 70d6a823c7949dfcc8b775481c017bca268b7f3a..f79a78ab5c3f4b70492a2b45d1e013ee8cf0f3dc 100644 (file)
@@ -174,6 +174,7 @@ void do_gettimeofday(struct timeval *tv)
        unsigned long seq;
        unsigned long usec, sec;
        unsigned long max_ntp_tick;
+       unsigned long flags;
 
        do {
                unsigned long lost;
@@ -198,6 +199,9 @@ void do_gettimeofday(struct timeval *tv)
                else if (unlikely(lost))
                        usec += lost * (USEC_PER_SEC / HZ);
 
+               usec += (unsigned long)((shadow_system_time -
+                       processed_system_time) / NSEC_PER_USEC);
+
                sec = xtime.tv_sec;
                usec += (xtime.tv_nsec / NSEC_PER_USEC);
 
@@ -209,9 +213,9 @@ void do_gettimeofday(struct timeval *tv)
                         * overflowed). Detect that and recalculate
                         * with fresh values.
                         */
-                       write_seqlock_irq(&xtime_lock);
+                       write_seqlock_irqsave(&xtime_lock, flags);
                        __get_time_values_from_xen();
-                       write_sequnlock_irq(&xtime_lock);
+                       write_sequnlock_irqrestore(&xtime_lock, flags);
                        continue;
                }
        } while (read_seqretry(&xtime_lock, seq));
@@ -273,6 +277,8 @@ int do_settimeofday(struct timespec *tv)
         */
        nsec -= (jiffies - wall_jiffies) * TICK_NSEC;
 
+       nsec -= (unsigned long)(shadow_system_time - processed_system_time);
+
        wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
        wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);